Effective SQL
著 : John L. Viescas、Douglas J. Steele、Ben G. Clothier
監訳 : 株式会社クイープ
発行年 : 2017 年
発行所 : 株式会社翔泳社
https://m.media-amazon.com/images/I/41Q1L-qiHbL.jpg
Amazon : https://amzn.to/3F2lPIN
感想・まとめ
SQL について、標準や複数の RDBMS の仕様を踏まえて説明されているので、SQL 全般について理解を深めることができる
リレーショナルモデルとは何か、みたいなところを詳しく説明してくれるわけではないので、それは別の書籍で学ぶ必要がある
個人的には 『理論から学ぶデータベース実践入門 ―― リレーショナルモデルによる効率的な SQL』 が良かった
本書では 『Database Design for More Mortals, Third Edition』 がおすすめされている
日本語訳はなさそう?
自分にとっては 「知らないことだらけでめっちゃ役に立つ」 って感じでもなかったけど、知らないこともちょこちょこあったので、有益だった
メモ
はじめに
SQL (Structured Query Language) は、ほとんどのデータベースシステムとやり取りするための標準言語
本書の対象者 : SQL を日常的に利用するアプリケーション開発者や DBA (Database Administrator) になったばかりの人
リレーショナルデータベースマネジメントシステム (RDBMS) は、リレーショナルデータベースの作成、管理、変更、操作を行うためのソフトウェアアプリケーションプログラム
SQL の略史
本書の内容は、現在の SQL についての ISO 規格である SQL/Foundation の ISO/IEC 9075-2:2011 に基づく
主要なデータベース製品のほとんどはこの規格を実装している
本書では、必要に応じて製品固有の構文を提供するため、以下の製品の最新ドキュメントも参照
IBM DB2、Microsoft Access、Microsoft SQL Server、MySQL、Oracle、PostgreSQL
DB-Engines は、DBMS の人気ランキングを毎月発表
1 章 データモデルの設計
データモデルがうまく設計されていないと効果的な SQL を書くことはできない
リレーショナルモデルに従った設計については 『Database Design for Mere Mortals, Third Edition』 がおすすめ
データモデルの設計のベストプラクティス
2 章 プログラム可能性とインデックスの設計
SQL クエリをうまく動作させるためのインデックス付け
RDB 設計のベストプラクティス
3 章 設計を変更できないときはどうするか
ビューを使って単純化
ETL を活用
サマリテーブルを作成して管理
UNION による非正規化データのアンピボットをする
和演算 (UNION) は Edgar F. Codd 博士により定義
UNION ALL は重複を取り除かないので、UNION と比べてパフォーマンスが良い
4 章 フィルタリングとデータの検索
関係代数の SQL での実装
CASE 文には単純 CASE 文と検索 CASE 文がある
データベースエンジンにインデックスを利用させるには、クエリの述語 (WHERE、ORDER BY、GROUP BY、HAVING など) が sargable (Search ARGumentABLE) であること
5 章 集約
SQL の集約
6 章 サブクエリ
サブクエリ
CTE (Common Table Expression)
7 章 メタデータの取得と分析
クエリアナライザ
RDB のメタデータ
ゾウとネズミの問題
8 章 直積
SQL の直積 (Cartesian product)
1 つ目のテーブルの全ての行を 2 つ目のテーブルの全ての行と組み合わせたもの
CROSS JOIN を利用する (FROM 句に複数のテーブルを記述するのでもよいはず?)
直接がどういう場面で有効か?
あり得る全ての可能性を列挙したいとき (例えば、顧客と商品の組み合わせをすべて列挙し、そこから実際に購入された顧客と商品の組み合わせを引くことで、購入してもらえる可能性があるものを一覧化する、とか)
9 章 タリーテーブル
タリーテーブル (tally table)
テーブル値関数 (table-valued function)
10 章 階層型データモデルの作成
ツリー構造のデータを SQL でどう表現するか?
やり方は 4 種類ある
隣接リストモデル (adjacency list model) : テーブルのある行から、そのテーブルの別の行を親として参照する
入れ子集合 (nested set) : 子孫や先祖を全部検索するのがやりやすい
経路実体化 (materialized path) : ファイルシステムのパスで表現するようなイメージ
祖先クロージャテーブル (ancestry closure table) : 経路実体化に対するリレーショナルアプローチ